#version 330 core
layout (location = 0) in vec3 aPos; // 顶点位置数据
layout (location = 1) in vec3 aNormal; // 顶点法向量数据

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

out vec3 Normal; // 法向量
out vec3 FragPos; // 世界坐标

void main()
{
    FragPos = vec3(model * vec4(aPos, 1.0)); // 将局部坐标转换成世界坐标，通过模型矩阵。
    Normal = mat3(transpose(inverse(model))) * aNormal; // 保持非均匀缩放时法线方向不会改变
    gl_Position = projection * view * vec4(FragPos, 1.0); // 将顶点从世界坐标系变换到裁剪空间坐标系
}

// Normal = mat3(transpose(inverse(model))) * aNormal;
//这段代码对法线向量进行了变换，以确保它们在变换后的坐标系中仍然保持正确的方向。具体过程如下：

//model：这是模型矩阵，用于将顶点从模型坐标系变换到世界坐标系。
//inverse(model)：计算模型矩阵的逆矩阵。
//transpose(inverse(model))：对逆矩阵进行转置操作。
//mat3(...)：将 4x4 矩阵转换为 3x3 矩阵，因为法线是3维向量。
//这种变换对于处理非均匀缩放和旋转特别重要。非均匀缩放会改变法线的长度和方向，而旋转则会改变法线的方向。
//通过这种变换，可以确保法线在变换后的坐标系中仍然正确，从而保证光照计算的准确性。